package cumt.oj;

/**
 * @Author Fizz Pu
 * @Date 2020/10/30 下午3:51
 * @Version 1.0
 * 失之毫厘，缪之千里！
 */

/**
 * 题目描述
 * 临近开学了，大家都忙着收拾行李准  备返校，但 I_Love_C 却不为此担心! 因为他的心思全在暑假作业上：目前为止还未开动。
 *
 * 暑假作业是很多张试卷，我们这些从试卷里爬出来的人都知道，卷子上的题目有选择题、填空题、简答题、证明题等。
 * 而做选择题的好处就在于工作量很少，但又因为选择题题目都普遍很长。如果有 5 张试卷，其中 4 张是选择题，最后一张是填空题，
 * 很明显做最后一张所花的时间要比前 4 张长很多。但如果你只做了选择题，虽然工作量很少，但表面上看起来也已经做了4/5的作业了。
 *
 * I_Love_C决定就用这样的方法来蒙混过关，他统计出了做完每一张试卷所需的时间以及它做完后能得到的价值（按上面的原理，选择题越多价值当然就越高咯）。
 *
 * 现在就请你帮他安排一下，用他仅剩的一点时间来做最有价值的作业。
 *
 * 输入
 * 测试数据包括多组。每组测试数据以两个整数 M,N(1<M<20,1<N<10000) 开头，分别表示试卷的数目和 I_Love_C 剩下的时间。
 * 接下来有 M 行，每行包括两个整数 T,V(1<T<N,1<V<10000)分别表示做完这张试卷所需的时间以及做完后能得到的价值，输入以 0 0 结束。
 *
 * 输出
 * 对应每组测试数据输出 I_Love_C 能获得的最大价值。保留小数点 2 位
 *
 * 提示：float 的精度可能不够，你应该使用 double 类型。
 *
 * 样例输入
 * 4 20
 * 4 10
 * 5 22
 * 10 3
 * 1 2
 * 0 0
 * 样例输出
 * 37.00
 */


// 编码习惯错误, 在进行编程时, 排序函数是这样写的
//  return ob.price - this.price 自己进行了类型的强转, 这样明显是错误的 -1.1转int是什么? 导致这个bug一直没发现

import java.util.Arrays;
import java.util.Scanner;

/**
 * 此题可以转换为完全背包问题
 * 不是0,1背包问题，原因是作业可以只做一部分
 * N : 背包总重
 * 试卷价值：物品价值， 试卷所需时间：物品重量
 * 采用单价的思路
 */


public class Main {

    static class Node implements Comparable<Node>{
        double price;
        int id;

        public Node(double price, int id)  {
            this.price = price;
            this.id = id;
        }


        @Override
        public int compareTo(Node ob){
            if(ob.price > this.price) return 1;
            else return -1;
        }
    }

    double getMaxValue(double[] times, double[] value, int restTime) {
        int r = restTime;
        double sums = 0;
        // 要通过单价找到对应物品的时间,价值.单个数组排序的方式肯定不行
        // 利用节点记录下信息即可
        Node[] nodes = new Node[times.length];
        for(int i = 0; i < times.length; ++i){
            nodes[i] = new Node(value[i]/times[i], i);
        }

        // 降序排序
        Arrays.sort(nodes);


        for(Node node: nodes){
            int id = node.id;
            if(times[id] <= r){
                sums += value[id];
                r -= times[id];
            } else {
                sums += (r * node.price);
                break;
            }
        }
        return sums;
    }
    public static void main(String[] args) {
        Main main = new Main();

        // 读取数据
        Scanner scanner = new Scanner(System.in);
        int itemCount, restTime;
        while (true){
            itemCount = scanner.nextInt();
            restTime = scanner.nextInt();
            if(itemCount == 0 && restTime == 0)break;
            double[] times = new double[itemCount];
            double[] values = new double[itemCount];
            for(int i = 0; i < itemCount; ++i){
                times[i] = scanner.nextDouble();
                values[i] = scanner.nextDouble();
            }
            System.out.printf("%.2f\n", main.getMaxValue(times, values, restTime));
        }
    }
}






